From 91a268f00e26448325cacf81536cfe2ed30a52d1 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Mon, 24 Jun 2013 12:35:39 +0200 Subject: [PATCH] stylecontext: add gtk_render_icon_surface This draws an icon from a cairo_surface. We want to use this more rather than render_icon as this means we can skip the pixbuf to surface conversion (including allocation and alpha premultiplication) at render time, plus we can use create_similar_image which may allow faster rendering. --- gtk/gtkstylecontext.c | 36 ++++++++++++++++++++++++++++++++++++ gtk/gtkstylecontext.h | 6 ++++++ gtk/gtkthemingengine.c | 24 ++++++++++++++++++++++++ gtk/gtkthemingengine.h | 8 +++++++- 4 files changed, 73 insertions(+), 1 deletion(-) diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c index 1c533bca14..d70aa56a47 100644 --- a/gtk/gtkstylecontext.c +++ b/gtk/gtkstylecontext.c @@ -4512,6 +4512,42 @@ gtk_render_icon (GtkStyleContext *context, cairo_restore (cr); } +/** + * gtk_render_icon_surface: + * @context: a #GtkStyleContext + * @cr: a #cairo_t + * @surface: a #cairo_surface_t containing the icon to draw + * @x: X position for the @icon + * @y: Y position for the @incon + * + * Renders the icon in @surface at the specified @x and @y coordinates. + * + * Since: 3.10 + **/ +void +gtk_render_icon_surface (GtkStyleContext *context, + cairo_t *cr, + cairo_surface_t *surface, + gdouble x, + gdouble y) +{ + GtkThemingEngineClass *engine_class; + GtkThemingEngine *engine; + + g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); + g_return_if_fail (cr != NULL); + + engine = _gtk_css_engine_value_get_engine (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_ENGINE)); + engine_class = GTK_THEMING_ENGINE_GET_CLASS (engine); + + cairo_save (cr); + + _gtk_theming_engine_set_context (engine, context); + engine_class->render_icon_surface (engine, cr, surface, x, y); + + cairo_restore (cr); +} + static void draw_insertion_cursor (GtkStyleContext *context, cairo_t *cr, diff --git a/gtk/gtkstylecontext.h b/gtk/gtkstylecontext.h index ddc30a99f4..a72b28cafe 100644 --- a/gtk/gtkstylecontext.h +++ b/gtk/gtkstylecontext.h @@ -1090,6 +1090,12 @@ void gtk_render_icon (GtkStyleContext *context, GdkPixbuf *pixbuf, gdouble x, gdouble y); +GDK_AVAILABLE_IN_3_10 +void gtk_render_icon_surface (GtkStyleContext *context, + cairo_t *cr, + cairo_surface_t *surface, + gdouble x, + gdouble y); GDK_AVAILABLE_IN_3_4 void gtk_render_insertion_cursor (GtkStyleContext *context, diff --git a/gtk/gtkthemingengine.c b/gtk/gtkthemingengine.c index fe72da1da8..006afe72c6 100644 --- a/gtk/gtkthemingengine.c +++ b/gtk/gtkthemingengine.c @@ -182,6 +182,11 @@ static void gtk_theming_engine_render_icon (GtkThemingEngine *engine, GdkPixbuf *pixbuf, gdouble x, gdouble y); +static void gtk_theming_engine_render_icon_surface (GtkThemingEngine *engine, + cairo_t *cr, + cairo_surface_t *surface, + gdouble x, + gdouble y); G_DEFINE_TYPE (GtkThemingEngine, gtk_theming_engine, G_TYPE_OBJECT) @@ -239,6 +244,7 @@ gtk_theming_engine_class_init (GtkThemingEngineClass *klass) klass->render_handle = gtk_theming_engine_render_handle; klass->render_activity = gtk_theming_engine_render_activity; klass->render_icon_pixbuf = gtk_theming_engine_render_icon_pixbuf; + klass->render_icon_surface = gtk_theming_engine_render_icon_surface; /** * GtkThemingEngine:name: @@ -2791,3 +2797,21 @@ gtk_theming_engine_render_icon (GtkThemingEngine *engine, cairo_restore (cr); } +static void +gtk_theming_engine_render_icon_surface (GtkThemingEngine *engine, + cairo_t *cr, + cairo_surface_t *surface, + gdouble x, + gdouble y) +{ + cairo_save (cr); + + cairo_set_source_surface (cr, surface, x, y); + + _gtk_css_shadows_value_paint_icon (_gtk_theming_engine_peek_property (engine, GTK_CSS_PROPERTY_ICON_SHADOW), cr); + + cairo_paint (cr); + + cairo_restore (cr); +} + diff --git a/gtk/gtkthemingengine.h b/gtk/gtkthemingengine.h index a3c48f2e16..f75464a932 100644 --- a/gtk/gtkthemingengine.h +++ b/gtk/gtkthemingengine.h @@ -70,6 +70,7 @@ struct _GtkThemingEngine * or #GtkProgressBar. * @render_icon_pixbuf: Renders an icon as a #GdkPixbuf. * @render_icon: Renders an icon given as a #GdkPixbuf. + * @render_icon_surface: Renders an icon given as a #cairo_surface_t. * * Base class for theming engines. */ @@ -174,9 +175,14 @@ struct _GtkThemingEngineClass GdkPixbuf *pixbuf, gdouble x, gdouble y); + void (* render_icon_surface) (GtkThemingEngine *engine, + cairo_t *cr, + cairo_surface_t *surface, + gdouble x, + gdouble y); /*< private >*/ - gpointer padding[15]; + gpointer padding[14]; }; GDK_AVAILABLE_IN_ALL -- 2.30.2